package sv1

import (
	"github.com/gin-gonic/gin"
	"github.com/spf13/cast"
	"go-vue/admin/adapt"
	"go-vue/admin/model"
	"go-vue/admin/utils"
)

type User struct {
}

type UserLogin struct {
	Token    string `json:"token"`
	UserInfo struct {
		Dashboard string   `json:"dashboard"`
		Role      []string `json:"role"`
		UserId    string   `json:"userId"`
		UserName  string   `json:"userName"`
	} `json:"userInfo"`
}

// LoginInput 登录
type LoginInput struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

// Login 登录获取token
func (f *User) Login(ctx *gin.Context) {
	input := &LoginInput{}
	err := ctx.BindJSON(input)
	if err != nil {
		utils.OutWrong(ctx, 400, "解析数据错误", err.Error())
		return
	}

	var info = (&model.UserMember{UserName: input.Username}).One()
	if info == nil {
		utils.OutWrong(ctx, 401, "账号或密码错误", nil)
		return
	}

	if utils.PassWordCompareLogin(input.Password, info.UserName, info.Salt, info.UserPassword) == false {
		utils.OutWrong(ctx, 401, "账号或密码错误！", nil)
		return
	}

	token, err := adapt.CreateJwt(cast.ToString(info.Uid), info.RealName)
	if err != nil {
		utils.OutWrong(ctx, 401, "设置数据错误", err.Error())
		return
	}

	res := &UserLogin{
		Token: token,
		UserInfo: struct {
			Dashboard string   `json:"dashboard"`
			Role      []string `json:"role"`
			UserId    string   `json:"userId"`
			UserName  string   `json:"userName"`
		}{
			Dashboard: "0",
			Role:      []string{"SA", "admin", "Auditor"},
			UserId:    cast.ToString(info.Uid),
			UserName:  info.UserName,
		},
	}

	info.LastLoginTime = info.LoginTime
	info.LoginTime = utils.DateNowString()
	info.Update()

	utils.OutSuccess(ctx, res)
}

// EditList 获取用户列表（编辑用）
func (f *User) EditList(ctx *gin.Context) {
	//权限控制
	if adapt.ComparePermission(ctx, "member.list") {
		utils.Forbidden(ctx,"member.list")
		return
	}

	res := new(model.UserMember).GetAllMember(model.GetPaginationInput(ctx))
	utils.OutSuccess(ctx, res)
}

// EditSave 编辑用户列表（编辑用）
func (f *User) EditSave(ctx *gin.Context) {
	//权限控制
	if adapt.ComparePermission(ctx, "member.edit") {
		utils.Forbidden(ctx,"member.edit")
		return
	}
	input := &model.UserMember{}
	err := ctx.BindJSON(input)
	if err != nil {
		utils.OutWrong(ctx, 400, "解析数据错误", err.Error())
		return
	}

	id, err := new(model.UserMember).SaveEditMember(input)
	if err != nil {
		utils.OutWrong(ctx, 500, "保存失败", err.Error())
		return
	}

	//回显
	info := &model.UserMember{Uid: id}
	info.One()
	utils.OutSuccess(ctx, info)
}

//EditDel 删除列表（编辑列表）
func (f *User) EditDel(ctx *gin.Context) {
	//权限控制
	if adapt.ComparePermission(ctx, "member.delete") {
		utils.Forbidden(ctx,"member.delete")
		return
	}
	input := &model.DeleteInputIds{}
	err := ctx.BindJSON(input)
	if err != nil {
		utils.OutWrong(ctx, 400, "解析数据错误", err)
		return
	}

	err = new(model.UserMember).DelEditUser(input)
	if err != nil {
		utils.OutWrong(ctx, 500, "保存失败", err.Error())
		return
	}

	utils.OutSuccess(ctx, nil)
}

//EditSetPwd 修改密码（编辑列表）
func (f *User) EditSetPwd(ctx *gin.Context) {
	//权限控制
	if adapt.ComparePermission(ctx, "member.reset") {
		utils.Forbidden(ctx,"member.reset")
		return
	}
	input := &model.SetUserMemberPwd{}
	err := ctx.BindJSON(input)
	if err != nil {
		utils.OutWrong(ctx, 400, "解析数据错误", err)
		return
	}

	err = new(model.UserMember).SetPwdEditMember(input)
	if err != nil {
		utils.OutWrong(ctx, 500, "修改失败", err)
		return
	}

	utils.OutSuccess(ctx, nil)
}
